
#ifndef _TABBONUS_H_
#define _TABBONUS_H_

#include "Bonus.h"
#include "Trajectoire.h"

/** @brief File brief description
 Le fichier TabBonus.h contient la declaration de toutes les fonctions et
 procedures necessaires au stockage dans un tableau de tous les bonus generes
 au cours du jeu
 */

/** @brief TabBonus est composee d'un tableau de pointeur sur bonus destines à
 * contenir tous les pointeurs sur les bonus generes lors de la destruction des
 * ennemis et le nombre de bonus (un entier)
 */
typedef struct
{
	Bonus** ptab_bonus;
	int nbre_bonus;
	
} TabBonus;


/** @brief Cette procedure initialise un tableau de pointeurs de bonus a nul
 * @param [in,out] ptab_pbonus
 */
void initTabBonus (TabBonus* ptab_pbonus);

/** @brief Cette fonction alloue l'espace memoire necessaire pour creer un
 * tableau de bonus, l'initialise et renvoie un pointeur sur celui-ci
 */
TabBonus* creerTabBonus ();

/** @brief Cette procedure libere l'espace memoire alloue pour chaque bonus
 * contenu dans le tableau et met le champ nbre_bonus a 0
 * @param [in,out] ptab_pbonus
 */
void libereTabBonus (TabBonus* ptab_pbonus);

/** @brief Cette procedure libere l'espace memoire alloue pour un tableau de
 * bonus
 * @param [in,out] pptab_pbonus
 */
void detruireTabBonus (TabBonus** pptab_pbonus);

/** @brief Cette fonction renvoie le nombre de pointeurs sur des bonus contenus
 * dans le tableau
 * @param [in] ptab_pbonus
 * @return ptab_pbonus->nbre_bonus
 */
const int getNbreBonusTabBonus (const TabBonus* ptab_pbonus);

/** @brief Cette procedure permet de changer le nombre de pointeurs sur des
 * bonus contenus dans le tableau
 * @param [in,out] ptab_pbonus
 * @param [in] nbre
 */
void setNbreBonusTabBonus (TabBonus* ptab_pbonus, const int nbre);

/** @brief Cette fonction renvoie le tableau de pointeurs sur des bonus de la
 * structure TabBonus
 * @param [in] ptab_pbonus
 * @return ptab_pbonus->ptab_bonus
 */
Bonus** get_ptab_bonusTabBonus (const TabBonus* ptab_pbonus);

/** @brief Cette fonction renvoie un pointeur sur le i-eme bonus du tableau
 * @param [in] ptab_pbonus
 * @param [in] i_bonus
 */
Bonus* getBonusTabBonus (const TabBonus* ptab_pbonus, const int i_bonus);

/** @brief Cette procedure permet de modifier le i-eme pointeur sur un bonus
 * du tableau
 * @param [in,out] ptab_pbonus
 * @param [in] i_bonus
 * @param [in] nouveau_bonus
 */
void setBonusTabBonus (TabBonus* ptab_pbonus, const int i_bonus, Bonus* nouveau_bonus);

/** @brief Cette procedure ajoute dans le tableau de bonus un nouveau bonus
 * en prenant pour parametre un pointeur sur ce bonus et incremente le champ
 * nbre_bonus
 * @param [in,out] ptab_pbonus
 * @param [in] pbonus
 */
void ajouterBonus (TabBonus* ptab_pbonus, Bonus* pbonus);

/** @brief Cette procedure supprime dans le tableau de bonus un ancien bonus
 * en prenant pour parametre un pointeur sur ce bonus et decremente le champ
 * nbre_bonus
 * @param [in,out] ptab_pbonus
 * @param [in] pbonus
 */
void supprimerBonus (TabBonus* ptab_pbonus, Bonus* pbonus);

#endif
